package com.test45_JUC;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
import java.util.concurrent.RecursiveTask;

/**
 * RecursiveTask分支任务，有返回值任务
 */
public class Demo28_RecursiveTask {

    public static void main(String[] args) throws Exception {
        SumTask task = new SumTask(1, 100);
        ForkJoinPool pool = new ForkJoinPool();  // 开启分支任务池
        Future<Integer> future = pool.submit(task);  // 执行分支任务
        System.out.println("分支任务计算结果：" + future.get());
    }
}

/**
 * 实现数据累加的计算
 */
class SumTask extends RecursiveTask<Integer> {
    private static final int THRESHOLD = 25;    // 分支阈值
    private int start;  // 开始计算数值
    private int end;    // 结束计算数值

    public SumTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    // 完成计算的处理
    @Override
    protected Integer compute() {
        // 所有的子分支的处理，以及所有相关分支的合并处理都在此方法之中完成
        int sum = 0;
        boolean isFork = (end - start) > THRESHOLD;    // 是否需要进行分支
        if (isFork) {   // 需要开启分支
            int middle = (start + end) / 2;
            SumTask leftTask = new SumTask(this.start, middle);
            SumTask rightTask = new SumTask(middle + 1, this.end);
            leftTask.fork();    // 开启左分支
            rightTask.fork();   // 开启右分支
            sum = leftTask.join() + rightTask.join();   // 等待分支处理的执行结果返回
        } else {    // 计算子分支
            for (int i = start; i <= end; i++) {
                sum += i;
            }
            System.out.printf("【%s】start = %d、end = %d、sum = %d%n",
                    Thread.currentThread().getName(), this.start, this.end, sum);
        }
        return sum;
    }
}
